package com.sort;

import java.util.Arrays;

/**
 * @BelongsProject: DataStructures
 * @BelongsPackage: com.sort
 * @Author: 江岸
 * @CreateTime: 2021-02-08 23:53
 * @Description: 基数排序
 */
public class RadixSort {

    public static void main(String[] args) {
        //int[] arr = {5,42,78,11,37,894,131,23,11,55,9992,6};
        int[] arr = new int[8000000];
        for (int i=0;i<arr.length;i++){
            arr[i] = (int) (Math.random()*80000000);
        }
        long l = System.currentTimeMillis();
        radixSort(arr);
        //System.out.println(Arrays.toString(arr));
        long l1 = System.currentTimeMillis();
        System.out.println((l1-l));
    }

    public static void radixSort(int[] arr){
        //每个桶的长度都应该为最大数组的长度，因为你不知道最后会分在几个桶里，只能每个都取最大
        int[][] datas = new int[10][arr.length];
        //下表数组,索引为桶号,值为该桶内数字个数
        int[] indexArr = new int[10];
        //求得最大位数
        int max = arr[0];
        for (int x:arr){
            if (x>max){
                max = x;
            }
        }
        int length = (max+"").length();
        for (int i=0,n=1;i<length;i++,n*=10){
            //每一轮
            //1.遍历数组入桶
            for (int j=0;j<arr.length;j++){
                //求得该位数上的数字，入相应的数据桶
                int tongNum = arr[j]/n%10;
                datas[tongNum][indexArr[tongNum]]=arr[j];
                indexArr[tongNum]++;
            }
            //2.把桶中数据放回原数组
            int tempIndex = 0;
            for (int k=0;k<10;k++){
                for (int m=0;m<indexArr[k];m++){
                    arr[tempIndex] = datas[k][m];
                    tempIndex++;
                }
                //记录个数的数组重置为0
                indexArr[k] = 0;
            }
        }
    }
}
